package cn.cyber.service;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import cn.cyber.entity.Student;

public class StudentService {

	// 对 data.txt 进行初始化 - list集合中的数据存储到文件中
	public int init(String filePathName, List<Student> students) {
		// 根据路径字符串创建一个File对象
		File file = new File(filePathName);
		// 如果文件不存在，则创建一个
		if (!file.exists()) {
			try {
				file.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		// 创建对象输出流
		ObjectOutputStream outputStream = null;
		int count = 0;
		try {
			outputStream = new ObjectOutputStream(new FileOutputStream(filePathName));
			// 把 list 集合中的元素写入文件中
			for (Student student : students) {
				count ++;
				outputStream.writeObject(student);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if (outputStream != null) {
					outputStream.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return count;
	}
	
	/*
	// 对 data.txt 进行初始化 - list集合中的数据存储到文件中
	public void init(String filePathName, List<Student> students) {
		// 根据路径字符串创建一个File对象
		File file = new File(filePathName);
		// 如果文件不存在，则创建一个
		if (!file.exists()) {
			try {
				file.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		// 创建对象输出流
		ObjectOutputStream outputStream = null;
		try {
			outputStream = new ObjectOutputStream(new FileOutputStream(filePathName));
			// 把 list 集合中的元素写入文件中
			for (Student student : students) {
				outputStream.writeObject(student);
			}
			outputStream.writeObject(null);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if (outputStream != null) {
					outputStream.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	*/

	// 把文件中的数据打印到控制台（console）
	public void show(String filePathName, int count) {
		
		// 创建对象输出流
		ObjectInputStream inputStream = null;
		List<Student> students = new ArrayList<>();
		try {
			inputStream = new ObjectInputStream(new FileInputStream(filePathName));
			// 把文件中的数据存入 list 集合
			// 对文件进行遍历操作 - 结束条件？ - 写入文件时，在最后位置，添加 null 作为结束标志
//			while (true) {
//				Student student = (Student)inputStream.readObject();
//				if (student == null) {
//					break;
//				}
//				students.add(student);
//			}
			for (int i = 0; i < count; i++) {
				students.add((Student)inputStream.readObject());
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if (inputStream != null) {
					inputStream.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		System.out.println("学号\t名字\t年龄\t性别\t状态\t分数\t专业");
		for (Student student : students) {
			if (student != null) {
				System.out.print(student.getNum() + "\t");
				System.out.print(student.getName() + "\t");
				System.out.print(student.getAge() + "\t");
				System.out.print(student.getGender() + "\t");
				System.out.print(student.getStatus() + "\t");
				System.out.print(student.getScore() + "\t");
				System.out.println(student.getProfession());
			}
		}
	}
	
	// 把文件中的数据打印到控制台（console）
	public void show(String filePathName) {
		
		// 创建对象输出流
		ObjectInputStream inputStream = null;
		List<Student> students = new ArrayList<>();
		try {
			inputStream = new ObjectInputStream(new FileInputStream(filePathName));
			// 把文件中的数据存入 list 集合
			// 对文件进行遍历操作 - 结束条件？ - 写入文件时，在最后位置，添加 null 作为结束标志
//				while (true) {
//					Student student = (Student)inputStream.readObject();
//					if (student == null) {
//						break;
//					}
//					students.add(student);
//				}
			Student student = new Student();
			while ((student = (Student)inputStream.readObject()) != null) {
				students.add(student);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if (inputStream != null) {
					inputStream.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		System.out.println("学号\t名字\t年龄\t性别\t状态\t分数\t专业");
		for (Student student : students) {
			if (student != null) {
				System.out.print(student.getNum() + "\t");
				System.out.print(student.getName() + "\t");
				System.out.print(student.getAge() + "\t");
				System.out.print(student.getGender() + "\t");
				System.out.print(student.getStatus() + "\t");
				System.out.print(student.getScore() + "\t");
				System.out.println(student.getProfession());
			}
		}
	}

	public int add(String filePathName, Student student, int count) {
		File file = new File(filePathName);
		/*
		 * 方法二：
		 * 1.根据用户输入的信息，创建一个 Student 对象
		 * 2.把新创建的 Student 对象追加到 data.txt 文件末尾
		 * 
		 * 问题：student 对象已写入 data.txt 中，但是无法显示，因为 student 对象在 null 后面
		 * 思路：
		 * 1.在首次写入 data.txt 时，对写入的元素个数进行计数，此时，末尾不需要添加 null - 修改 init()
		 * 2.把新创建的 Student 对象追加到 data.txt 文件末尾
		 * 3.更新个数
		 */
		// 2.把新创建的 Student 对象追加到 data.txt 文件末尾
		ObjectOutputStream outputStream = null;
		try {
			outputStream = new ObjectOutputStream(new FileOutputStream(filePathName, true));
			outputStream.writeObject(student);
			count ++;
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if (outputStream != null) {
					outputStream.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return count;
	}
	
	public void add(String filePathName, Student student) {
		File file = new File(filePathName);
		/*
		 * 方法二：
		 * 1.根据用户输入的信息，创建一个 Student 对象
		 * 2.把新创建的 Student 对象追加到 data.txt 文件末尾
		 * 
		 * 问题：student 对象已写入 data.txt 中，但是无法显示，因为 student 对象在 null 后面
		 * 思路：
		 * 1.在首次写入 data.txt 时，对写入的元素个数进行计数，此时，末尾不需要添加 null - 修改 init()
		 * 2.把新创建的 Student 对象追加到 data.txt 文件末尾
		 * 3.更新个数
		 */
		// 2.把新创建的 Student 对象追加到 data.txt 文件末尾
		ObjectOutputStream outputStream = null;
		try {
			outputStream = new ObjectOutputStream(new FileOutputStream(filePathName, true));
			outputStream.writeObject(student);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if (outputStream != null) {
					outputStream.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		/*
		 * 方法一：
		 * 1.根据用户输入的信息，创建一个 Student 对象 - Main
		 * 2.把 data.txt 中的数据存入 list 集合
		 * 3.把新创建的 Student 对象加入 list 集合
		 * 4.把 list 集合中的元素重新写入 data.txt 文件中
		 * 注意：存入时，需将原数据删除
		 */
		/*
		// 2.把 data.txt 中的数据存入 list 集合
		// 创建对象输入和输出流
		ObjectInputStream inputStream = null;
		ObjectOutputStream outputStream = null;
		List<Student> students = new ArrayList<>();
		try {
			inputStream = new ObjectInputStream(new FileInputStream(filePathName));
			// 把文件中的数据存入 list 集合
			// 对文件进行遍历操作
			Student stu = new Student();
			while ((stu = (Student)inputStream.readObject()) != null) {
				students.add(stu);
			}
			// 3.把新创建的 Student 对象加入 list 集合
			students.add(student);
			
			// 4.把 list 集合中的元素重新写入 data.txt 文件中
			outputStream = new ObjectOutputStream(new FileOutputStream(filePathName));
			// 把 list 集合中的元素写入文件中
			for (Student s : students) {
				outputStream.writeObject(s);
			}
			outputStream.writeObject(null);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if (inputStream != null) {
					inputStream.close();
				}
				if (outputStream != null) {
					outputStream.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		*/
	}

	public List<Student> del(String num, List<Student> students) {
		Iterator<Student> iterator = students.iterator();
		while (iterator.hasNext()) {
			if (num.equals(iterator.next().getNum())) {
				iterator.remove();
				break;
			}
		}
		return students;
	}
}
